Build your own Pimatic GUI - with template

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

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.769

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

ESPimaticRF : verstuur RF verkeer over wifi vanuit Pimatic

Door Koffie op zondag 13 november 2016 18:25 - Reacties (12)
Categorie: -, Views: 2.858

Een lang verwachte feature voor Pimatic is eindelijk beschikbaar: verzenden van RF verkeer over wifi op plekken waar de Pimatic op de Raspberry Pi geen bereik heeft :Y)

Wat heb je nodig :?
Een werkende Pimatic installatie
ESPimaticRF
Minstens 2 ESP8266 modules
Minstens 1 setje sender/receiver (zorg dat je een zogenoemd superheterodyne setje hebt)
Arduino IDE 1.6.5
ESP8266 core for Arduino 2.3.0

Het probleem :?
Normaal zul je een Raspberry Pi hebben met daarop Pimatic, waar vervolgens een Arduino Nano aan hangt voor het RF verkeer (zie ook : Koffie's tweakblog: Native RF zenden en ontvangen met pimatic)
Het nadeel hiervan is dat de Raspberry Pi vaak ergens weggewerkt word (bij mij bijvoorbeeld in de meterkast) en je niet altijd overal een voldoende RF bereik hebt. Het gevolg is dat niet elk RF signaal door Pimatic ontvangen word, of een uitgezonden signaal niet altijd aankomt.

De oplossing
Met ESPimaticRF kun je het RF signaal eerst over wifi laten versturen zodat het vanaf een andere plek alsnog als RF verstuurd word. andersom kan ook : ergens op een andere plek word het RF signaal opgepikt om vervolgens via wifi naar Pimatic gestuurd te worden.
Het systeem is zo opgebouwd dat je op meerdere plekken een zogenoemde node kunt neerleggen, welke allemaal met Pimatic communiceren. Op deze manier kun jet het RF bereik enorm vergroten. In theorie zou je zelfs een node ergens op een totaal ander adres kunnen installeren en zo met 1 groot Pimatic netwerk bouwen.

Hoe installeer ik het :?
Ik ga er vanuit dat je reeds een werkend Pimatic systeem hebt, met Arduino Nano en RF hardware zoals uitgelegd in Koffie's tweakblog: Native RF zenden en ontvangen met pimatic
Neem een ESP8266 (bij vooorkeur een NodeMCU).
Download de software van Github en op ESPimaticRF.ino in je Arduino IDE
Zorg dat je de correct ESP in je boardmanager hebt geselecteerd, met voldoende SPIFFS ruimte (3M SPIFFS).
Compileer en upload de code naar je ESP
Na het uploaden zal de ESP opnieuw opstarten en, indien nodig, de SPIFFS formatteren. Dit kan even duren - hou de boel in de gaten via de Serial Monitor
De ESP zal nu in AP modus gestart zijn. Verbind je pc/table/telefoon met het wifi netwerk van de ESP (SSID : ESPimaticRF , wachtwoord espimaticrf).
Ga naar http://192.168.4.1 en vul hier je eigen wifi gegevens in.
De ESP zal nu wederom opnieuw opstarten en verbinden met je eigen wifi netwerk.
Op de Serial Monitor kun je zien welk DHCP adres de module heeft gekregen van je wifi.
Ga naar het nieuwe IP adres met je favoriete browser. Je zult nu een simepel upload pagina zien. Upload nu alle bestanden in de directory "SPIFFS" van de github download.
Wanneer de upload klaar is, start de ESP handmatig opnieuw op.
Ga nu wederom naar het IP adres van de ESP met je browser, de volledige webGUI is nu beschikbaar.
Kies Menu -> System -> Config

http://zooi.oostindie.com/images/148espimaticrf_config.png

We gaan de ESP configureren om als 'homeduino' te reageren. Bij mode kies je dus voor de optie 'homeduino'.
De homeduino kan zowel met als zonder RF hardware werken, we beginnen zonder. Laat de opties 'Receiver pin' en 'Transmitter pin' dus leeg.
Bij Receive Action kies je voor 'Do nothing' (er hang immers geen onvanger aan deze module.
Bij Transmit Action kies je voor 'Transmit to all nodes' (wederom : we hebben aan deze ESP geen RF hardware hangen).
Bij UDP repeat is het een beetje kiezen wat het beste voor je werkt. Het versturen van RF over wifi gaat via UDP. Omdat UDP van zichzelf een onbetrouwbaar protocol is, word het pakket een paar keer herhaald. Afhankelijk van de afstand die je met de modules moet overbruggen adviseer ik een waarde tussen de 3 en de 6.
Bij API key vul je een API key in die door alle ESP's gebruikt zal worden. Belangrijk : deze API key moet hetzelfde zijn als de optionele API key in config van de homeduino plugin in Pimatic!
De wifi velden zijn al ingevuld.
Sla de wijzigingen op en herstart de ESP om config te laden.

Je kunt de ESP nu van je computer loskoppelen en aan je Rasperry Pi aansluiten. Let op dat je pimatic eerst stopt voordat je de ESP middels USB aan de Raspberry Pi koppelt.
Start nu Pimatic op en controleer de logfile. Als het goed is denkt Pimatic nog steeds dat er een doodnormale homeduino aangesloten is.

Nu nemen we nog een ESP en voorzien deze wederom van ESPimaticRF software. Deze keer sluiten we ook een RF zender en ontvanger aan.
Herhaal deze stappen als bij de vorige module om de ESP te configureren.
Bij 'mode' kies je echter deze keer voor 'node'.
Vul de correcte Transmitter pin en Receiver pin in (GPIO nummering!).
Bij Receive action kies je voor 'send to Pimatic' , bij Transmit action kies je voor 'Transmit with local RF'.
Zorg ervoor dat je bij Pimatic IP het correct IP/FQDN van je Pimatic installatie kiest en bij Pimatic Port de juiste port waarop het draait.
Bij Black/Whitelist mode kiezen we voorlopig 'Allow everything'.
Sla de wijzigingen op en herstart de ESP.
Indien je dit nog niet gedaan hebt, sluit nu eerst de RF modules aan op de correcte GPIO's

Laat de node nog aan je computer verbonden en op de Serial Monitor. Wissel nu een RFdevice op pimatic van status, als het goed is moet je nu op de Serial Monitor zien dat er een pakket van de homeduino binnenkomt, en nog mooier : de local RF zender op de node zal nu het RF verkeer gaan versturen.

Het werkt, wat kan ik er verder nog mee :?
Met bovenstaande uitleg heb je een basic netwerk van ESP's kunnen maken. Wat de node ontvangt word keurig naar Pimatic verstuurd, en wat Pimatic over RF wil versturen komt keurig bij de node terecht.
Je kunt nu verder gaan met het finetunen van de configuratie. Zo kun je alsnog een RF zender en ontvanger aan de homeduino koppelen, en in de config aangeven dat deze gebruikt kunnen worden.
Ook kun je een extra ESP installeren in node mode en deze ergens anders plaatsen. Beide nodes zullen dan het verkeer wat door de homeduino verstuurd word ontvangen en uitzenden.
Dit laatste kan natuurlijk een probleem zijn als beide nodes binnen het bereik van een RF device liggen. Deze kan dan meerdere keren hetzelfde signaal ontvangen.
Daarom kan er gebruik gemaakt worden van blacklisting of whitelisting.
Via de config kun je aangeven welke modus de node moet hebben (allow everything, allow everything except blacklist of allow nothing except whitelist).
Om nu een bepaal device aan de blacklist of whitelist toe te voegen ga je als volgt te werk :
Zorg dat de node communicatie van de homeduino kan ontvangen
Vanaf Pimatic schakel je 1 keer het device waar het om gaat
Op de WebGUI van de node ga je nu naar Menu -> System -> BlackWhitelist , als de opdracht voor het RFdevice bij deze node aangekomen is, zul je hier het protocol , ID en unit zien.
Kies nu voor Blacklist of Whitelist
Afhankelijk van de gekozen configratie zal het nieuwe device expliciet wel of niet toegelaten worden.

Om een bepaald device te kunnen black/whitelisten moet het protocol bekend zijn (en herkend worden) binnen ESPimaticRF. Alle protocollen staan beschreven in protocols.json.
Op moment van publiceren van deze blogpost staan er nog maar een paar protocollen beschreven (switch1 t/m switch5 en dimmer1).
Ik hoop op korte termijn het aantal protocollen hierin snel uit te breiden, hou de github pagina in de gaten voor updates.

Mocht je nog vragen hebben kan dat altijd hier, in het GoT topc (https://gathering.tweakers.net/forum/list_messages/1609839) of op het Pimatic forum (https://forum.pimatic.org...t-espimaticrf-coming-soon)

DIY draadloze temperatuursensor voor pimatic - en meer! - Update

Door Koffie op zaterdag 23 januari 2016 13:42 - Reacties (20)
Categorie: -, Views: 5.401

[Update]
Na het plaatsen van deze blogpost is er het nodige op de Github repo geplaatst.
Vragen/problemen kun je kwijt in het issues 'forum' , ook is er een wiki aangemaakt. Er zijn inmiddels ook wat aanpassingen doorgevoerd op de code, lees even de release notes door op Git ;)

Zo'n 2 jaar geleden plaatste ik deze post : Koffie's tweakblog: DIY draadloze temperatuursensor voor pilight
Met deze sensor kon ik de temperatuur in de woonkamer meten en met RF naar pilight verzenden. In de tussentijd is er weer een hoop veranderd.
Zoals lezers van mijn spaarzame blogposts weten ben ik al lange tijd volledig over op Pimatic, een domotica systeem wat ik zelf erg fijn vind.

http://zooi.oostindie.com/images/49920160123_125539_tn.jpg

De hardware markt is ook veranderd. Inmiddels koop je voor een paar dollars een ESP8266. Een ESP is nog het best uit te leggen als 'een Arduino op 80 Mhz, meer flash geheugen onboard wifi'. Ja je leest het goed, fully wifi op een chip zo groot als een stuiver :Y)
Dit opent natuurlijk een wereld aan mogelijkheden.
Een lange wens was om een soort alles in 1 module te bouwen, waarbij ik in een config kan aangeven wat zijn functie is en gaan met die banaan, zonder dat ik voor elk mini-projectje de code hoef aan te passen.

Om dit voor elkaar te krijgen heb ik mijn persoonlijke wensen op een rijtje gezet en ben ik begonnen met schrijven van code en testen met diverse sensoren.
Mijn persoonlijk eisenpakket was/is:

- Compatible met Pimatic
- Temperatuur meten en versturen
- Eventueel luchtvochtigheid meten en versturen
- Relays aansturen
- infrarood zenden
- Weergave van temperatuur, leesbaar op grote afstand

Uiteindelijk is daar mijn project ESPimatic uit voortgekomen. Alle bovenstaande eisen zitten in de code, het is slechts een kwestie van de juiste hardware aan of uit zetten. De module is volledige te besturen vie een webinterface. Zelfs vervangen van een nieuwe flash of HTML bestanden kan vanaf de website.

http://zooi.oostindie.com/images/585espimatic_02.png

Wat heb ik allemaal nodig :?
Om te beginnen een ESP, Zelf gebruik ik een ESP8266-12 met 4mb flash. Daarnaast heb je de sensor naar wens nodig (DS18B20, DHTxx, max7219 LED Matrix).


Hoe installeer ik het :?
Download de code: https://github.com/koffienl/ESPimatic
Compileer de code met Arduino en upload deze via serial naar je ESP.

OK, software staat er op, en nu :?
De eerste keer zal de ESP opstarten in Access Point modus. Maak met verbinding met SSID ESPimatic en wachtwoord espimatic.
Ga met je browser naar 192.168.4.1 , je ziet nu een simpele pagina om je wifi gegevens in te vullen. Na het invullen zal de ESP herstarten en verbinding maken met je wifi netwerk.
Zoek op welk IP adres van je DHCP server heeft gekregen (is te zien op console of in je router/DHCP), en ga er met je browser naar toe.
Je ziet nu wederom een simpele pagina. Met deze pagina upload je 1 voor 1 alle HTML bestanden die je van GitHub hebt gedownload.
Herstart nu voor de laatste keer je ESP en maak verbinding met je browser naar het IP adres.
Je ziet nu de website zoals bedoeld is voor ESPimatic.
Begin door in het menu System -> GPIO aan te vinken welke GPIO's je tot je beschikking hebt. Vervolgens ga je in het menu System -> Pimatic om daar je pimatic API gegevens in te vullen.
Je bent nu klaar om sensoren aan of uit te zetten.
GPIO's die je niet in het begin als zijnde beschikbaar hebt aangevuld en GPIO's in gebruik door sensoren kun je niet kiezen.

Wat kan ik met al die pagina's :?
Een korte toelichting op alle pagina's en menu optie's die er zijn:

Hardware -> DS18B20
Hier kun je een DS18B20 aan of uit zetten. Vul ook in hoe de variabele in pimatic heet zodat de temperatuur naar pimatic verstuurd kan worden

Hardware -> LED Matrix
Wanneer je 2 max7219 LED Matrix'en goed hebt aangesloten kun je die hier aan zetten. Let op : CLK moet naar GPIO14 en DIN naar GPIO13. CS gaat op de GPIO die je hier kiest.
Selecteer ook wat je wil zien op je matrix.

Hardware -> IR LED
Wanneer je een IR code weet voor je apparatuur (zie hiervoor http://www.righto.com/200...rared-remote-library.html ) kun je de ESPimatic een IR code laten versturen. In pimatic heb ik een variabele aangemaakt (bijvoorbeeld $ACwoonkamerON en als inhoud de IR code van mijn airco. Vervolgens heb ik een dummyswitch aangemaakt met de volgende rule:

code:
1
IF ACon is turned on THEN execute "sudo curl  --silent --data 'action=ir&value=$ACslaapkamerON' http://esp01/api > /dev/null"


Pimatic verstuurd dan naar de 'api' van ESPimatic de IR code, de ESP zal deze vervolgens naar de IR LED sturen.

Hardware -> Relay
Er kunnen tot maximaal 4 relais aangesloten worden op de ESP. Hier kun je de functie aan of uit zetten en de GPIO instellen.

Hardware -> DHT
Indien je liever een DHTxx gebruikt ipv een DS18B20 dan kan dat. Persoonlijk vind ik een DHT(11) verre van accuraat en stabiel .. andere zweren er bij. Je zou in theorie ook een DHT22 kunnen aansturen, maar omdat ik die niet heb weet ik niet of dat werkt. Volgens de code moet het werken ;)

System -> Wifi
Wijzig hier je wifi instellingen. Wanneer de ESP bij opstarten geen verbinding met wifi kan maken, zal deze altijd als Access Point opstarten (zelfde gegevens als bij eerste keer gebruiken).

System -> Pimatic
Hier kun je al je Pimatic gegevens invullen

System -> Firmware
Hier kun je een BIN file uploaden. Let op dat je bij het compileren in Arduino de juiste ESP aangeeft. Je kan zoveel flash hebben als je wil, maar als de draaiende BIN gecompileerd is als een 1mb chip gaat het simpelweg niet lukken.

System -> GPIO
Hier kun je beschikbare GPIO's instellen.

System -> Reset
Dit zal *alle* opgeslagen settings verwijderen, inclusief wifi gegevens. Deze gegevens zijn niet te herstellen!

System -> Filemanager
Hier kun je de HTML files uploaden en/of verwijderen. Let op : bestaande bestanden zullen zonder bevestiging overschreven worden. Verwijderde bestanden zijn niet meer terug te halen.
Wanneer je root.html verwijderd, zal de ESP opstarten met een versimpelde filemanager als root.

Refresh
Refresh haalt de specifieke instellingen van de pagina waar je je bevind opnieuw op.

Reboot
Hiermee herstart je de ESP.

De ESPimatic heeft ook een simpele 'api' waarmee je via een HTTP opdracht commando's kunt versturen.
Syntax van de URL is : http://esp-ip/api?action=[action]&value=[value]
De volgende opdrachten zijn mogelijk:

action = ir , value = 3420,1592,500,1128, ...... hiermee laat je een IR code versturen
action = reboot , value = true Herstart de ESP
action = matrix_brightness value=[0-8] wijzig de helderheid van deLED Matrix
action = matrix_display , value = [on-off[ Zet de LED Matrix uit
action = relay[1-4] , value = [on-off[ Zet relay x aan of uit
action = clearerror , value =[wifi,ds18b20,eeprom,upgrade] Hiermee verwijder je bepaalde errors, dat wprd echter ook al gedaan door de webpagina die de foutmelding ontvangt.
action = reset , value=true Hiermee verwijder je alle opgeslagen gegevens, inclusief wifi