Build your own Pimatic GUI - with template

Door Koffie op maandag 20 februari 2017 14:58 - Reacties (2)
Categorie: -, Views: 1.632

Blog is in stonecoal English, sorry :P

This blog is a updated, English, version of my previous blog: Koffie's tweakblog: Maak je eigen HTML GUI voor Pimatic - Basic
I have created a template GUI that you can edit/extend with you own information

Prerequisites:? /
- Pimatic up and running
- Some sort of webserver for hosting your files with some basic webserver knowledge
- Basic Ppimatic knowledge
- A little knowledge of HTML/Javascript/Jquery
- Template webfiles : https://github.com/koffienl/PimaticGUI/tree/master/Template
- A admin username and password for Pimatic API connection

Installation :?
Installation is easy. Download the template webfiles from github and copy them into the webroot of your favorite webserver. The HTML assumes that the index.html file is in the root of the URL (http://ipwebserver/index.html not http://ipwebserver/mygui/index.html).

Open js/pimatic-socket.js in you favorite text editor and go to line 8 :

code:
1
var socket = io.connect('http://pimatic_ip/?username=admin&password=admin', {


Edit this line so that it corresponds with the FQDN / IP of your Pimatic server with a correct username and password.
Save the file

Now open your GUI by browsing to http://ipwebserver/index.html in your favorite browser.
You should a page like this:

http://zooi.oostindie.com/images/444pimatic_UI_template_tn.jpg

That is, you have installed your own GUI :Y)

Getting thermostat / heating info on the GUI :?
the first 'block' (Row 1, Column 1) contains everything to get info about thermostat/heating into the GUI. If you do not want this in your GUI you can remove it from the HTML file.

Open index.html in your favorite text editor and go to line 61 look for the following code:

code:
1
<h2 id="LivingRoomTemperature">LivingRoomTemperature</h2>



This line will be used to display the current livingroom temperature used in Pimatic. Go to the original pimatic website and look for the variable that is used for displaying the livingroom temprature. Click on the text, a black 'popup' will appear.

http://zooi.oostindie.com/images/300pimatic_UI_find_ID.jpg
The first line will begin with ID: followed by the ID of the device.
With this little trick you can find out the Pimatic ID of the device you wan to add to the GUI. When using a (Pimatic) ID in this guide, use this to find the ID you need.
Remember te ID you have. In my example the ID is id-woonkamer-temperatuur
Go back to the editor and change the ID used in the HTML.

Change this

code:
1
<h2 id="LivingRoomTemperature">LivingRoomTemperature</h2>



Into this:

code:
1
<h2 id="">LivingRoomTemperature</h2>



By default the template only supports buttons and presence devices. So we have to add some coded to js/pimatic-socket.js
Go to line 63 and add the following code:

code:
1
2
3
4
            if (devices[key].id == "id-woonkamer-temperatuur")
            {               
                $("#gui").find('#LivingRoomTemperature').html("LivingRoomTemperature" + devices[key].attributes[0].value +" °C")
            }



Save both file (index.html and pimatic-socket.js and do a hard refresh (CTRL-F5) in your browser.
If you did everything according to this guid, you should see the temperature of your livingroom with the same value as in Pimatic.

Unfortunately this code only updates the temperature upon connecting to Pimatic. We need to add some extra lines to update the temperature every time Pimatic send a updated temperature.

In /js/pimatic-socket.js search for the following code:

code:
1
2
socket.on('deviceAttributeChanged', function(attrEvent) {
    console.log(attrEvent);


Right after these 2 lines, add this code:

code:
1
2
3
4
   if (attrEvent.deviceId == "id-woonkamer-temperatuur")
   {
        $("#gui").find('#LivingRoomTemperature').html("LivingRoomTemperature " + attrEvent.value +" °C");
   }


Save the file and do a hard refresh in your browser.
You should see the livingroom temperature that will be updated realtime as soon as Pimatic receives a new value.

Now we can do the same for a other temperature. In my example I will use a weather temperature value.
Find the Weather temperature in the index.html :

code:
1
                                    <h4 id="WeatherTemperature">WeatherTemperature</h4>



Find the ID of your weather temperature. In my situation the ID is weer.
Find the previous added code:

code:
1
2
3
4
            if (devices[key].id == "id-woonkamer-temperatuur")
            {               
                $("#gui").find('#LivingRoomTemperature').html("LivingRoomTemperature" + devices[key].attributes[0].value +" °C")
            }



Right after that, add the following code:

code:
1
2
3
4
            if (devices[key].id == "weer")
            {
                $("#gui").find('#WeatherTemperature').html("Lelystad " + devices[key].attributes[0].value +" °C");
            }



Now we have to add extra code to update the temperature when getting pushed from pimatic.
find the previous added code:

code:
1
2
3
4
   if (attrEvent.deviceId == "id-woonkamer-temperatuur")
   {
        $("#gui").find('#LivingRoomTemperature').html("LivingRoomTemperature " + attrEvent.value +" °C");
   }


Right after that, add the following code:

code:
1
2
3
4
   if (attrEvent.deviceId == "weer")
   {
        $("#gui").find('#WeatherTemperature').html("Lelystad " + attrEvent.value +" °C");
   }



OK, so far we have added the livingroom temperature and the weather temperature. When we open the page the info is gathered from Pimatic and when Pimatic pushes a updated value it is immediately changed on your GUI.
Next step is to display some information about the state of the (dummy)thermostat).

In my example, the ID of the thermostat is thermostaat

Find the previous added code:

code:
1
2
3
4
            if (devices[key].id == "weer")
            {
                $("#gui").find('#WeatherTemperature').html("Lelystad " + devices[key].attributes[0].value +" °C");
            }


Right after that, add the following code:

code:
1
2
3
4
5
            if (devices[key].id == "thermostaat")
            {
                $("#gui").find('#setpoint').html("Setpoint " + devices[key].attributes[0].value +" °C");
                $("#gui").find('#mode').html(" [" + devices[key].attributes[2].value +"]");
            }



To update the information after a update from Pimatic:
Find the previous added code:

code:
1
2
3
4
   if (attrEvent.deviceId == "weer")
   {
        $("#gui").find('#WeatherTemperature').html("Lelystad " + attrEvent.value +" °C");
   }


Right after that, add the following code:

code:
1
2
3
4
5
6
7
8
9
   if (attrEvent.deviceId == "thermostaat" && attrEvent.attributeName == "temperatureSetpoint")
   {
       $("#gui").find('#setpoint').html("Setpoint " + attrEvent.value +" °C");
   }

   if (attrEvent.deviceId == "thermostaat" && attrEvent.attributeName == "mode")
   {
       $("#gui").find('#mode').html(" [" + attrEvent.value + "]");
   }



When doing a hard refresh on indedx.html in your browser, all the thermostat information should be the same as in Pimatic.
Try changing the mode or setpoint temperature in Pimatic, you should see a instant update in your own GUI :Y)

Now one more last thing we need is the option to change the setpoint from the GUI. In the pimatic-socket.js there is allready some code for this:


code:
1
2
3
4
5
6
7
8
9
10
function ChangeSetpoint(type){
    socket.emit('call', {
        id: 'executeAction-1',
        action: 'executeAction',
        params: {
            actionString: 'press ' + type
        }
    });

}



This function is called when you click / tap on the arrows you find next to the text "Change setpoint".
This code will tell the Pimatic API to press 2 buttons called setpoint-min and setpoint-plus
Go to Pimatic and create a buttons device:
http://zooi.oostindie.com/images/372pimatic_UI_ChangeSetpo_tn.jpg

You now have the 2 buttons that will be 'pressed' by the GUI through the API. Pressing these buttons will do nothing, so you have to add some rules to the buttons:

code:
1
WHEN setpoint-plus is pressed THEN set temp of thermostaat to ($thermostaat.temperatureSetpoint + 0.5)



code:
1
WHEN setpoint-min is pressed THEN set temp of thermostaat to ($thermostaat.temperatureSetpoint - 0.5)



Test it by clicking / tapping on the arrows. It should change your setpoint and update the new values immediately in the GUI.

You are almost done with the thermostat block. Only one last thing is needed: a ON/OFF button for your heating device.
Find the ID for your heating device in Pimatic. In my case the ID is pelletkachel-power
Search for the following line index.html :

code:
1
<button class="btn btn-default btn-lg fullwidth uibutton" onclick="toggleDevice('heating-device')" id="heating-device">Heating Device</button>


Change the 2 words heating-device with your Pimatic ID. For me this would be:

code:
1
2
3
4
5
6
7
8
9
<button class="btn btn-default btn-lg fullwidth uibutton" onclick="toggleDevice('pelletkachel-power')" id="pelletkachel-power">Heating Device</button>[/b]

Refresh the index.html in your browser. When you press the [b]Heating Device[/b] button in the GUI, it should by turned on in Pimatic. When you turn it off in Pimatic you should see change the button in your GUI

[b]Adding extra buttons to the GUI :? [/b]
OK, the hard part is done, almost any other devices will require just 1 line of HTML code.
On the GUI there is a button called [b]Button 1[/b]. We will change this into a working device. Fin a on/off device in Pimatic and remember the ID. In my case I will use a device with ID [b]terrasoverkapping[/b]
Find [b]Button 1[/b] in the [b]index.html[/b] :
[code]<button class="btn btn-default btn-lg fullwidth uibutton" onclick="toggleDevice('button1')" id="button1">Button 1</button>


Change the ID you hae in Pimatic, and if you want give it a better display name:

code:
1
<button class="btn btn-default btn-lg fullwidth uibutton" onclick="toggleDevice('terrasoverkapping')" id="terrasoverkapping">Button for terrasoverkapping</button>



Save the file and refresh in your browser. Your button should reflect the state in Pimatic when loading the GUI and also update immediately when it is changed in Pimatic.

Adding presence device to the GUI :?
You can add several types of presence devices to the GUI. It can be a dummy-presence device , a ping-device or a contact-device.
First, as usual, find the Pimatic ID of the device. In my example it will be anybody-home. Find the presence device in the index.html :

code:
1
<div class="well well-sm"><b>Presence 1 </b><span class="circle" id="anybody-home"></span></div>


And update it with your info:

code:
1
<div class="well well-sm"><b>Anybody home? </b><span class="circle" id="anybody-home"></span></div>



Save the HTML file and refresh your browser.

You are done! You have created your own GUI that reflects the Pimatic states. It will be update instantly when you something changes in Pimatic. Or, you can push the buttons in the GUI so Pimatic will execute the push on the button.
You can extend the GUI page with as many buttons, text or presence device as you want.

Maak je eigen HTML GUI voor Pimatic - Basic

Door Koffie op zondag 19 februari 2017 12:41 - Reacties (8)
Categorie: -, Views: 2.770

In mijn vorige blog had ik het al even over mijn laatste projectje : een tablet aan de muur om Pimatic aan te sturen.
Omdat de gewone Pimatic GUI soms wat overvol kan raken en niet altijd even vriendelijk is voor non-techneuten ben ik op zoek gegaan naar een makkelijk aan te passen GUI.
Het begon met deze post : https://forum.pimatic.org...g-your-own-user-interface
Gebruiker kitsunen had een HTML pagina in elkaar gezet welke gebruik maakt van de webocket-API van Pimatic.
Omdat de GUI nogal onoverzichtelijk in elkaar zat en heel veel handwerk bevatte, heb ik de files eens flink onderhanden genomen: https://github.com/koffienl/PimaticGUI/tree/master/Basic

Het resultaat is een simpele site welke verbinding maakt met de websocket-API en alles keurig verwerkt in de GUI.
Mijn huidige GUI is een stuk complexer dan waar deze blog over gaat. Daarom heb ik de configuratie behoorlijk gestript zodat er een basic GUI overblijft. Van hieruit kun je zelf aan de gang met uitbreidingen. Later zal ik wat complexere voorbeelden posten.
Om een idee te geven : mijn huidige GUI verschilt op basis van de stand van een dummy switch, welke weer gebaseerd is op het seizoen. Daarnaast heb ik mijn afspraken uit een google calendar ook op de GUI geplaatst. Maar dat is dus voor later.

http://zooi.oostindie.com/images/938pimatic_UI_winter_tn.jpg http://zooi.oostindie.com/images/797pimatic_UI_summer_tn.jpg

Installeren :?
Voor het installeren van de files is niet veel nodig. Gewoon een simpele webserver. Ik ge er vanuit dat je weet hoe je een simpel webservertje installeert en aan de praat krijgt.
Download deze files en plaats ze je in webroot.

Aanpassen naar je eigen pimatic :?
Het eerste wat je moet doen is het bewerken van js/pimatic-socket.js regel 7.
Standaard staat daar:

code:
1
var socket = io.connect('http://pimatic_ip/?username=admin&password=admin', {


Pas deze regel aan naar een correcte URL , username en password voor je pimatic installatie. Omdat de websocket verbinding door de client browser word opgezet, is het van belang dat de URL die je hier opgeeft ook benaderbaar is voor de client. Als je http://192.168.1.1 als URL gebruikt, zal je dit dus niet buiten je eigen netwerk kunnen gebruiken. Verderop in deze blog zal ik nog iets roepen over een reverse proxy hiervoor.

Wanneer je de URL aangepast hebt kun je de GUI gaan gebruiken. De standaard buttons uit mijn installatie zul je niet veel aan hebben, maar het gaat je een beeld geven van de mogelijkheden.
Wanneer de verbinding met de websocket gelukt is, zul je een GUI met buttons zien. Blijft deze leeg, dan is het inloggen niet gelukt en heb je waarschijnlijk wat verkeerd ingevoerd.

Je eigen buttons defineren :?
Ik heb de code zo gemaakt dat het zo simpel mogelijk werkt. Eigenlijk hoef je alleen in de index.html je eigen buttons aan te maken, de code doet de rest.
Bij het verbinden met de websocket krijgt het script de state van alles wat maar in Pimatic aanwezig is doorgestuurd.
De code looped door alle devices en kijkt of er in de GUI een button is met dezelfde naam. Indien deze gevonden word, zet hij de button in de correcte staat.

Wanneer Pimatic een update voor een device heeft, zal hij deze pushen naar alles wat met de websocket verbonden is. Onze GUI krijgt dus vrijwel direct een update wanneer Pimatic een device van state veranderd (dit kan door een gebruiker vanuit de Pimatic GUI zijn, of door Pimatic zelf middels een rule).
Ook hier geld weer hetzelfde : het script kijkt of er een button is met de devicenaam en zo ja dan word deze aangepast.

Om nu te zorgen dat je je eigen buttons in je GUI te zien krijgt, zal ik het eea uitleggen hoe dit te doen.
Open index.html in je favoriete tekst editor Ga naar regel 86, dit is de regel voor een switch met de naam eettafel :

code:
1
<button class="btn btn-default btn-lg fullwidth uibutton" onclick="toggleDevice('eettafel')" id="eettafel">Eettafel</button>



Je ziet hier 3 maal het woord 'eettafel'. Belangrijk om te weten is dat in deze regels de eerste twee woorden 'eettafel' refereren naar het Pimatic ID van een device met de naam 'eettafel' De laatste vermelding van 'Eettafel' (in mijn geval begint deze met een hoofdletter) is puur de weer te geven naam op de knop in de GUI. Je kan hier elke tekst in zetten die je wilt.

Goed, je heb nu in de HTML code gezien hoe een button eruit ziet. Ga nu naar Pimatic en zoek daar een device op die je in je eigen GUI wil zetten.
Stel je hebt een lamp met de naam "Mijn nachtlampje" klik dan op de naam "Mijn nachtlampje" in de Pimatic GUI Er zal nu een zwart popup menutje tevoorschijnkomen. De eerste regel begint met "ID"
Dit is het ID van het device. Stel dat er nu bij jou "ID: nachtlampje" staat, dan weet je dat het ID van "Mijn nachtlampje" "nachtlampje" is.
In de eerder aangehaalde regel voor "eettafel" ga je nu het ID "nachtlampje" gebruiken:

code:
1
<button class="btn btn-default btn-lg fullwidth uibutton" onclick="toggleDevice('nachtlampje')" id="nachtlampje">Knop voor mijn nachtlampje</button>



Sla je wijzigingen op en refresh de pagina in je browser.
Als het goed is zie je nu een knop met de tekst "Knop voor mijn nachtlampje" welke automatisch van staat wisselt wanneer je in Pimatic de knop op ON of OFF zet.
Andersom zal ook werken : wissel de knop in Pimatic en vervolgens vanuit je eigen GUI. Als het goed is kun je je nachtlampje nu vanuit 2 verschillende GUI's bedienen :Y)

Kan dit ook met een presence device :?
Jazeker! Ik maak nogal veel gebruik van de zogenoemde presence devices, dus deze wile ik zeker ook op kunnen nemen in de GUI.

Het bewerken van een presence device is redelijk gelijk aan hoe we een button kunnen bewerken/aanmaken.
Zoek de volgende regel op index.html :

code:
1
<div class="well well-sm"><b>Anybody home </b><span class="circle" id="anybody-home"></span></div>


De eerste vermelding van "Anybody home" is de vrije tekst op de GUI, de tweede vermelding "anybody-home" is het Pimatic ID van de presence device. Ook deze kun je op dezelfde manier achterhalen als het ID van een button.

Hoe zit het met variables :?
Uiteraard kun je ook variables afvangen vanuit de websocket.
Als je kijkt naar de index.html zie je daar linksbovenin een blok welke volledig bedoeld is voor alles wat verwarming en temperatuur te maken heeft.
In Pimatic heb ik een variable voor de woonkamertemperatuur. Deze komt ook terug in de index.html :

code:
1
<h2 id="WoonkamerTemperature"></h2>

code]

Dit ID word ook gebruikt in pimatic-socket.js :

code:
1
2
3
4
            if (devices[key].id == "id-woonkamer-temperatuur")
            {               
                $("#gui").find('#WoonkamerTemperature').html("Woonkamer " + devices[key].attributes[0].value +" °C")
            }


Er word gezocht naar een device met de naam id-woonkamer-temperatuur en vervolgens word de waarde van dit device gebruikt als tekst in het blok WoonkamerTemperature
Op deze manier kun je op verschillende plaatsen de aarde van een variable in je GUI zetten.

Temperatuur van een thermostaat wijzigen :?
Ik maak gebruik van een dummy-thermostat in Pimatic om de gewenste temperatuur in te stellen. Ik vond het belangrijk om de doeltemperatuur te kunnen zien en aanpassen vanuit mijn eigen GUI.
Het stuk in de inde.html wat hiervoor zorgt:


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
                        <h3><span id="setpoint"></span><span id="mode"></span></h3>
            <table width=100%>
                <tr>
                    <td width=33% style="text-align:center;">
                        <span class='fa fa-arrow-up' onclick="ChangeSetpoint('setpoint-plus')"></span>
                    </td>
                    <td width=33% style="text-align:center;">
                        <h4>Change setpoint</h4>
                    </td>
                    <td width=33% style="text-align:center;">
                        <span class='fa fa-arrow-down' onclick="ChangeSetpoint('setpoint-min')"></span>
                    </td>
                </tr>
            </table>


Het ID setpoint bevat de waarde van de setpoint. Deze word gevuld vanuit pimatic-socket.js middels de volgende code:

code:
1
2
3
4
5
            if (devices[key].id == "thermostaat")
            {
                $("#gui").find('#setpoint').html("Setpoint " + devices[key].attributes[0].value +" °C");
                $("#gui").find('#mode').html(" [" + devices[key].attributes[2].value +"]");
            }



Het aanpassen van de setpoint vanuit de eigen GUI gebeurd door op de pijltjes te klikken bij de tekst "Change setpoint"
Als je goed kijkt zie je dat bij het klikken op het 'pijltje omhoog' de volgende function word aangeroepen: ChangeSetpoint('setpoint-plus')
Deze function is terug te vinden in pimatic-socket.js :

code:
1
2
3
4
5
6
7
8
9
10
function ChangeSetpoint(type){
    socket.emit('call', {
        id: 'executeAction-1',
        action: 'executeAction',
        params: {
            actionString: 'press ' + type
        }
    });

}


Eigenlijk doet dit niet meer dan een button in Pimatic indrukken met het ID setpoint-plus. Aan deze button hangt weer een rule:

code:
1
WHEN setpoint-plus is pressed THEN set temp of thermostaat to ($thermostaat.temperatureSetpoint + 0.5)



Dit truukje zou je ook voor andere zaken kunnen gebruiken om een wat complexere actie te laten gebeuren door op een simpel iccontje te drukken in je eigen GUI.

Maar mijn wachtwoord staat nu plaintekst in de sourcecode ?! :?
Dat klopt, daar valt helaas weinig aan te veranderen. ik heb dit als volgt opgelost:
- Zorg dat je een DNS record hebt voor je GUI : mijngui.mijndomein.nl en verwijs deze naar je eigen public IP
- Gebruik een Apache server met reverse proxy
- Vraag om een username/password wanneer de client buiten je eigen subnet valt


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<VirtualHost *:80>
        ServerName mijngui.mijndomein.nl

    <Location />
        AuthType Basic
        AuthName "Restricted Files"
        AuthUserFile /usr/local/apache/passwd/passwords
        Require user MijnUsername
  Order allow,deny
  Allow from 192.168.1
  Satisfy any
    </Location>


        ProxyPass / http://192.168.1.1/pimatic/
        ProxyPassReverse / http://192.168.1.1/pimatic/
</VirtualHost>



Op deze manier kun de GUI altijd bereiken via http://mijngui.mijndomein.nl maar krijg moet je een username en password gebruiken als je buiten je subnet (192.168.1.x) valt.
Aanmaken van een apache username : https://httpd.apache.org/...uth.html#gettingitworking

Het is toch nog aardig complex allemaal, kan dit niet wat simpeler :?
Klopt, je hebt een redelijke basiskennis van Pimatic, HTML en javacript/jquery nodig. Dat is inherent aan zelf hobbyen met dergelijke systemen. Wanneer dit allemaal te hoog gegrepen is, kun je wellicht beter gebruik blijven van de standaard GUI die Pimatic je bied.

Je pelletkachel aansturen met pimatic, een stapje verder

Door Koffie op donderdag 9 februari 2017 20:06 - Reacties (11)
Categorie: -, Views: 3.350

Het is alweer een tijd geleden dat ik wat (on)zinnigs heb geroepen over Pimatic, dus hoog tijd om jullie daar mee lastig te vallen :Y)
Eerst een kleine inleiding, daarna ga ik verder over Pimatic
Ik heb al een aantal keren wat verteld over het aansturen van je kachek mbv Pimatic : Koffie's tweakblog: Je kachel aansturen met pimatic, een echte thermostaat

Fikkie stoken!
Ik ben helaas gebonden aan stadsverwarming, wat als enige voordeel heeft dat ik nergens rekening hoef te houden met een modulerende ketel oid. Gewoon simpel aan en uit.
Aangezien het monopolistische stadsverwarming een zeer duur grapje probeer ik zo efficient mogelijk te verwarmen met zo veel mogelijk comfort.
Al sinds wij in ons huis wonen hadden wij een houtkachel. Lekker fikkie stoken, romantisch naar de vlammen staren en genieten van de warmte.

Helaas was de 9kW haard niet heel efficient geplaatst door de installateur, iets wat mij jaren tegen het zere been schopte.
Aanpassen was een prijzig klusje, want het betrof een inbouwhaard. De kleinste aanpassing betekende dus het openbreken van een muur en daarna de muur weer dichtmaken (en opnieuw voorzien van spachtelputz laag zodat de boel er weer netjes uit zag).
Inmiddels liep ik tegen een vastzittende schuifdeur van de haard aan wat er voor zorgde dat ik een open verbinding tussen woonkamer en buiten had via het rookkanaal. Niet echt goed voor de temperatuur in de woonkamer dus ;)

In december hakte we de knoop door : de muur moest open en er moest iets aan de haard gebeuren. Grofweg hadden we 2 opties : de bestaande haard repareren of een nieuwe haard plaatsen.
Aangezien de haard toch wel ruim 13 jaar oud was en niet de efficiėntie gaf die wilden, besloten we om een nieuwe haard te plaatsen. Ook de techniek rondom haarden heeft niet stil gestaan dus er waren modellen met veel meer rendement.

Bij toeval stuitte ik op pelletkachels. Ik wist van het bestaan af, maar had hier eigenlijk 2 vooroordelen over : verschrikkelijk duur in aanschaf en alleen een klein waakvlammetje.
Na een paar uur inlezen bleken beide vooroordelen ongegrond. Het budget wat ik in gedachte had voor de nieuwe haard was ook toereikend voor een pelletkachel, en dat waakvlammetje was toch echt wel wat groter dan ik dacht.
Na een paar avondjes internet afstruinen waren we er uit : de voorzetmuur gaat eruit en er komt een losstaande pelletkachel
Na de nodige verbouwingen aan de woonkamer rond de feestdagen, konden we eindelijk genieten van onze nieuwe warmtebron :Y)

http://zooi.oostindie.com/images/16220170104_195904_tn.jpg

Dit ging toch over Pimatic :?
Na deze lange intro is het tijd om weer op het oorspronkelijke onderwerp terug te keren: Pimatic.
Met het verwarmen middels stadsverwarming had ik een 'programma' nodig welke op gezette tijden de setpoint van de gewenste temperatuur te wijzigen, zodat het lekker warm zou zijn bij thuiskomst.
Omdat de pelletkachel een totaal andere warmte geeft, vele malen sneller verwarmd en door de geforceerde ventilatie een veel egalere warmte in de woonkamer weet te krijgen was dit programma niet meer zo nodig.
Hoog tijd om dit dus anders aan te pakken

Van voorgedefinieerd programma naar verwarmen op aanwezigheid
Zoals gezegd verwarmde ik voorheen op basis van een programma, gebaseerd op ons dagelijkse ritme door de week. Uitzondering zoals een dagje thuiswerken werden opgevangen door een knop "vandaag als zondag" op ON te zetten. Meer hierover is te lezen in mijn vorige blog onder het kopje "De thermostaat moet 'slimmer' worden".

Met de pelletkachel was een dergelijk strak schema niet meer nodig. Verwarmen word nu volledig gestuurd op basis van aanwezigheid.
Nu kun je aanwezigheid op verschillende manieren detecteren, maar ik heb besloten om dit op basis van bereikbaarheid van de smartphones te doen.
Wij zijn een redelijk standaard gezien (mannetje, vrouwtje, 2 kinderen en een videocamera) en lopen allemaal met smarphones rond.
Alle telefoons hebben een vast IP adres gekregen vanuit de DHCP server in de router.
In pimatic zijn alle telefoons opgenomen middels de pimatic-ping plugin.
De telefoons worden elke minuut gepinged om te kijken of ze online zijn.
Vervolgens is er een dummyPresence sensor genaamd Anybod-Home welke op absent of present word gezet op basis van pingen van die telefoons.
Zodra 1 telefoon online is, gaat Anybody-Home op present. Wanneer geen enkele telefoon online is schiet deze naar absent.

Ping device voor een telefoon:

code:
1
2
3
4
5
6
7
8
9
10
11
12
    {
      "host": "192.168.2.102",
      "interval": 60000,
      "id": "telefoon-richard",
      "name": "Telefoon Richard",
      "class": "PingPresence"
    },
[code]

De nodige rules:
[code]
WHEN [telefoon-simone is present for 1 minute or telefoon-elise is present for 1 minute or telefoon-richard is present for 1 minute] and $AnybodyHome = 0 THEN $AnybodyHome = 1 and set presence of anybody-home present



code:
1
WHEN telefoon-simone is absent for 1 minute and telefoon-elise is absent for 1 minute and telefoon-richard is absent for 1 minute THEN $AnybodyHome = 0 and set presence of anybody-home absent



Goed, nu hebben we een idee wanneer er iemand thuis is en kunnen we daarop de te behalen temperatuur instellen. Stel je nu botweg je setpoint in op 20 bij anybody-home en op 17 bij nobody-home, dan ben je 's nachts ook aan het stoken.
Daarom is het nog steeds 'nodig' om hier wat slimmigheidjes op toe te passen. Ik heb de volgende rules voor het wijzigen van de setpoint, op basis van aanwezigheid en andere omstandigheden:

Niemand thuis, dan mag de setpoint naar 17 graden. De marge om uit te gaan is 0,4 graden.

code:
1
WHEN $AnybodyHome = 0 and mode of thermostaat is auto THEN set temp of thermostaat to 17 and $PelletkachelStopMarge = 0.4



Vanaf 05:00 's ochtends mag het 20 graden worden als er iemand thuis is

code:
1
WHEN $AnybodyHome = 1 and it is after 05:00 and before 22:00 and mode of thermostaat is auto THEN set temp of thermostaat to 20 and $PelletkachelStopMarge = 0.6



Na 22:00 's avonds mag de setpoint naar 16,5 maar alleen als de woonkamerverlichting uit is.

code:
1
WHEN $AnybodyHome = 1 and dressoir is off and it is after 22:00 and mode of thermostaat is auto THEN set temp of thermostaat to 16.5 and $PelletkachelStopMarge = 0.4


Voor het geval ik nog even langer blijf hangen op de bank ..

code:
1
WHEN $AnybodyHome = 1 and dressoir is off and it is after 00:00 and before 05:00 and mode of thermostaat is auto THEN set temp of thermostaat to 16.5 and $PelletkachelStopMarge = 0.4



Omdat een pelletkachel niet te pas en te onpas aangezet kan worden, heb ik de regels voor aan en uit zetten wat strakker gemaakt:


code:
1
WHEN $WoonkamerTemperatuur < ($thermostaat.temperatureSetpoint - $PelletkachelStartMarge) for 10 minutes and pelletkachel-power is turned off for $PelletkachelMinStoptime minutes THEN turn pelletkachel-power on



code:
1
WHEN mode of thermostaat is not boost and $WoonkamerTemperatuur > ($thermostaat.temperatureSetpoint + $PelletkachelStopMarge) for 10 minutes and pelletkachel-power is turned on for $PelletkachelMinRuntime minutes THEN turn pelletkachel-power off



In principe komt het neer op : de pelletkachel moet minsten een uur branden om aan te mogen, en moet minsten 10 minuten onder setpoint - marge zijn. Uit zetten van de pelletkachel weer hetzelfde : minsten een uur branden en minsten 10 minuten setpoint + marge als temperatuur (als overdag iemand thuis is, is de marge 0,6).

Maar hoe stuur je een pelletkachel aan :?
Dat verschilt eigenlijk per merk en type. De duurdere hebben vaak een externe thermostaat aansluiting. Mijn pelletlkachel heeft dit niet. Wel beschikt de pelletkachel over een temperatuursensor (bedraad) zodat hij de omgevingstemperatuur kan meten.
De pelletkachel kan dan op basis van temperatuur aan of uit gaan. Ook kun je een volledig weekprogramma programmeren in de kachel.
Omdat ik alles al regel met Pimatic, en ik graag de kachel op afstand aan en uit wil kunnen zetten moest daar dus iets voor bedacht worden.

Mijn pelletkachel heeft dus geen externe input. Wel kan deze met een afstandsbediening aan en uit gezet worden.
Uiteindelijk heb ik een ESP gebouwd welke de IR commando's van deze afstandsbediening naar de pelletkachel stuurt. De ESP is weer via wifi te benaderen en an dus door pimatic aangestuurd. De ingebouwde thermostaat van de pelletkachel word dus vrijwel niet gebruikt.
Omdat mijn vader in dezelfde periode dezelfde pelletkachel kocht heb ik er direct een leuk webinterfaceje voor gemaakt:

http://zooi.oostindie.com/images/259Screenshot_20170117_06_tn.jpg

Cool! Waar vind ik meer informatie :?
Het makkelijkste is om gebruik te maken van bestaande topics, het bereik is zo vele malen groter en ik hoef geen persoonlijke helpdesk te spelen ;)
Voor pimatic : het grote pimatic topic - home domotica met je Raspberry Pi
Alles over pelletkachels : Het pelletkachel topic
Pimatic forum : https://forum.pimatic.org/

Nog andere nieuwtjes :?
Jazeker!
Ddoor omstandigheden had ik een tablet 'over'. Hierdoor begon mijn oude wens toch weer te kriebelen : een tablet aan de muur waarmee ik in 1 oogopslag alles rondom pimatic kon bedienen. Ik ben hier inmiddels al een behoorlijk eind mee. Bedrading (voor permanent aan de lader hangen) is al netjes in de muur weggewerkt. Nu nog even een mooi frame maken en dan kan de tablet opgehangen worden. Ik zal hier binnenkort een apart blogje over maken.
Sneak preview:

http://zooi.oostindie.com/images/938pimatic_UI_winter_tn.jpg http://zooi.oostindie.com/images/797pimatic_UI_summer_tn.jpg

Inmiddels staat er ook een nieuwe versie van ESPimaticRF op github welke MQTT ondersteund. Zie ook het vorige blog hierover: Koffie's tweakblog: ESPimaticRF : verstuur RF verkeer over wifi vanuit Pimatic